home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
726-750
/
726
/
hextract
/
source
/
extract.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-18
|
10KB
|
317 lines
/****************************************************************************
* Extract.c *
* *
* Chas A. Wyndham 18th Aug 1992. *
* *
* Compiles under Lattice 5 and links with Decomp.o to make Hextract, a *
* programme for accessing header-file data. *
* *
* This code is Freeware like Hextract itself. You are welcome to improve *
* it - but please send me a copy. *
* *
****************************************************************************/
#include "exec/types.h"
#include "exec/memory.h"
#include "graphics/gfxbase.h"
#include "libraries/dos.h"
#include "intuition/intuition.h"
#include "intuition/intuitionbase.h"
#include "string.h"
#include "stdio.h"
struct IntuitionBase *IntuitionBase ;
struct GfxBase *GfxBase ;
struct Screen *screendata ;
struct FileHandle *window, *fi ;
char buffer[100], line[256], *febuf=0, *inbuf=0 ;
int found = 0, located = 0 ;
int fesize, insize, n, libh = 0 ;
USHORT chip ptrImage[] = {
0x0000, 0x0000,
0x6018, 0x0000,
0xc00c, 0x0000,
0xc30c, 0x0000,
0xc78c, 0x0000,
0xcccc, 0x0000,
0x7878, 0x0000,
0x3030, 0x0000,
0x0000, 0x0000, };
void search(), showlib(), getwin(), cleanup() ;
main(argc, argv)
int argc ;
char *argv[] ;
{
char ch = NULL, header[2], path[100] ;
int i = 0, result = 1, lockset = 0, win = 1, cont, iscomp = 0 ;
struct FileLock *lock, *oldlock ;
struct FileHandle *fum ;
BPTR pathlock ;
IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0) ;
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0) ;
screendata = (struct Screen *)AllocMem(30, MEMF_PUBLIC) ;
GetScreenData (screendata, 30, WBENCHSCREEN, NULL) ;
stcgfp (path, argv[0]) ;
if (strcmp (path, ""))
if (path[strlen(path)-1] !=':')
strcat (path, "/") ;
strcat (path, "headers.z") ;
if ((lock = (struct FileLock *)Lock(path, ACCESS_READ)) == 0)
{ if ((pathlock = findpath("headers.z")) != -1)
{ oldlock = (struct FileLock *)CurrentDir("df0:", ACCESS_READ) ;
CurrentDir((struct FileLock *)pathlock, ACCESS_READ) ;
lockset = 1 ;
}
}
else UnLock (lock) ;
if ((fi = (struct FileHandle *)Open(path, MODE_OLDFILE)) == NULL)
{ puts ("No headers.z file\n") ;
cleanup() ;
}
Seek (fi, 0, 1) ;
insize = Seek (fi, 0, -1) ;
Read (fi, &header, 2);
if ((header[0] == 'L') && (header[1] == 'H'))
{ iscomp = 1 ;
Read (fi, &fesize, 4) ;
fesize = fesize + 4 ;
Seek (fi, 2, -1) ;
insize = insize - 2 ;
}
else Seek (fi, 0, -1) ;
if ((inbuf = (char *)AllocMem(insize, MEMF_PUBLIC)) == NULL)
{ puts ("Insufficient memory\n") ;
cleanup() ;
}
Read (fi, inbuf, insize) ;
if (iscomp)
{ if ((febuf = (char *)AllocMem((fesize), MEMF_PUBLIC)) == NULL)
{ puts ("Insufficient memory\n") ;
cleanup() ;
}
if (iscomp)
{ SetPointer (IntuitionBase->ActiveWindow, &ptrImage, 7, 16, -4, -4) ;
result = DECOMPA (inbuf, febuf) ;
ClearPointer(IntuitionBase->ActiveWindow) ;
FreeMem (inbuf, insize) ;
}
}
else
{ febuf = inbuf ;
fesize = insize ;
}
Close (fi) ;
if (result == 0) puts ("Decompression failed\n") ;
else if (result == 2) puts ("Out of memory\n") ;
if (argc == 2)
{ fum = (struct FileHandle *)Open(argv[1], MODE_NEWFILE) ;
Write (fum, febuf, fesize) ;
Close (fum) ;
}
window = (struct FileHandle *)Open
("CON:100/0/344/30/Hextract V1.2 - Enter 'quit' to exit", MODE_NEWFILE) ;
Write (window, "\n Enter symbol: ", 15) ;
if (lockset)
{ CurrentDir (oldlock, ACCESS_READ) ;
UnLock ((struct FileLock *)pathlock) ;
}
while (1)
{ cont = 0 ; n = 0 ;
if (WaitForChar (window, 999999999))
{ Read (window, &ch, 1) ;
buffer[i++] = ch ;
if (ch == '\n')
{ /*Ctime (1) ;*/
buffer[--i] = '\0' ;
if (i)
{ if (!stricmp (buffer, "quit")) cleanup() ;
else
{ if (!stricmp (buffer, "ok"))
{
if (!win)
{ Close(window) ;
window = (struct FileHandle *)Open("CON:100/0/400/30/Hextract V1.2", MODE_NEWFILE) ;
Write (window, "\n Enter symbol: ", 17) ;
win = 1 ; cont = 1 ;
}
else { i = 0 ; continue ; }
}
if (!cont)
{ if (win)
{ Close (window) ;
getwin() ;
win = 0 ;
Write (window, "\n ", 6) ;
Write (window, buffer, strlen(buffer)) ;
Write (window, "\n", 1) ;
}
SetPointer (IntuitionBase->ActiveWindow, &ptrImage, 7, 16, -4, -4) ;
search () ;
memset (buffer, '\0', 100) ;
ClearPointer(IntuitionBase->ActiveWindow) ;
Write (window, "\n Enter symbol\n\n ", 19) ;
} }
i = 0 ;
} /*Cend(1) ;*/
}
} }
cleanup() ;
}
void getwin()
{
if (screendata->Height > 511)
window = (struct FileHandle *)Open("CON:0/0/640/512/Hextract V1.2", MODE_NEWFILE) ;
else if (screendata->Height >399)
window = (struct FileHandle *)Open("CON:0/0/640/400/Hextract V1.2", MODE_NEWFILE) ;
else if (screendata->Height >255)
window = (struct FileHandle *)Open("CON:0/0/640/256/Hextract V1.2", MODE_NEWFILE) ;
else
window = (struct FileHandle *)Open("CON:0/0/640/200/Hextract V1.2", MODE_NEWFILE) ;
}
void cleanup ()
{
FreeMem (screendata, 30) ;
if (febuf) FreeMem (febuf, fesize) ;
if (window) Close (window) ;
if (GfxBase != NULL) CloseLibrary(GfxBase);
if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
/*Creport() ;*/
exit(0);
}
void search()
{
char *tok, *tok2, temp[256], *buf1, source[40], change = 0 ;
int numbrackets = 0, libh ;
located = 0 ;
libh = 0 ;
while (fgts (line) != 0)
{ /*Ctime(2) ;*/
onbreak(&cleanup) ;
chkabort() ;
buf1 = stpblk(line) ;
if (!change)
if (!strcmp (buf1, "FF\n")) change = 1 ;
if (change)
{ if (stcpmw (buffer,".??????"))
{ showlib() ;
break ;
}
if (stcpmw (buf1, ".??????"))
{ tok = strtok (buf1, " \n") ;
strcpy (source, tok) ;
libh = 1 ;
}
}
/*Cend(2) ;*/
strcpy (temp, buf1) ;
tok = strtok (temp, " \n") ;
if (stcpmwa (temp,buffer))
{ located = 1 ;
strcpy (temp, line) ;
tok = strtok (line, " \n") ;
tok2 = strtok (NULL, "\n") ;
Write (window, "\n ", 4) ;
Write (window, tok2, strlen(tok2)) ;
if (libh)
{ Write (window, " ", 2) ;
Write (window, source, strlen(source)) ;
}
Write (window, "\n", 1) ;
if (stcpmw (temp, "struct"))
{ fgts (temp) ;
if (strchr (temp, '{'))
{ numbrackets++ ;
Write (window, " ", 4) ;
Write (window, temp, strlen(temp)) ;
while (numbrackets)
{ fgts (temp) ;
if (strchr (temp, '{'))
{ numbrackets++ ;
Write (window, " ", 4) ;
Write (window, temp, strlen(temp)) ;
continue ;
}
else if (strchr (temp, '}'))
{ numbrackets-- ;
Write (window, temp, strlen(temp)) ;
continue ;
}
tok = strtok (temp, " \0") ;
tok2 = strtok (NULL, " \0") ;
Write (window, " ", 4) ;
Write (window, tok2, strlen(tok2)) ;
do
{ tok2 = strtok (NULL, " \0") ;
if (stcpmw (tok2, "struct"))
{ Write (window, "\n", 1) ;
break ;
}
Write (window, " ", 1) ;
Write (window, tok2, strlen(tok2)) ;
} while (tok2) ;
} }
}
tok = strtok (line, " \n") ;
tok2 = strtok (NULL, "\n") ;
Write (window, "\n ", 8) ;
Write (window, tok2, strlen(tok2)) ;
}
}
if (!located) Write (window, " Not found\n", 18) ;
}
void showlib()
{
char *tok1, *tok2, buf[256] ;
int num, i ;
if (stcpmw (buffer,".device") || stcpmw (buffer,".resource")
|| stcpmw (buffer,".library"))
{ while (!stcpmw (line, buffer))
fgts (line) ;
}
else { libh = 0 ;
return ;
}
tok1 = strtok (line, " \n") ;
tok2 = strtok (NULL, " \n") ;
num = atoi (tok2) ;
for (i = 0 ; i < num ; ++i)
{ fgts (buf) ;
tok1 = strtok (buf, " \n") ;
tok2 = strtok (NULL, "\0") ;
Write (window, " ", 3) ;
Write (window, tok2, strlen(tok2)) ;
}
located = 1 ;
}